#pragma once
#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include"Mutex.hpp"
//这个文件是对同步的条件变量进行包装，方便后面的线程池进行提前准备，并且可以额帮助后面的基于循环队列的生产者消费者模型

using namespace MutexMoble;

namespace CondMoble
{
    class Cond
    {
    public:
        Cond()
        {
            pthread_cond_init(&_cond,nullptr);  //对条件变量进行初始化
        }

        //由于我们需要用到锁，因为我们需要访问临街资源，所以需要进行解锁处理
        void Wait(Mutex &mutex)
        {
            int n = pthread_cond_wait(&_cond,mutex.GetMutex());
            (void)n;
        }

        //对一个线程进行叫醒处理
        void Signal()
        {
            int n = pthread_cond_signal(&_cond);
            (void)n;
        }

        //对所有睡眠的线程进行叫醒处理

        void Brodcast()
        {
            int n = pthread_cond_broadcast(&_cond);
            (void)n;
        }
        ~Cond()
        {
            pthread_cond_destroy(&_cond);
        }
    private:
        pthread_cond_t _cond; //定义一个条件变量的类型
    };
}